//https://www.nowcoder.com/practice/e69148f8528c4039ad89bb2546fd4ff8?tpId=13&tqId=1375424&ru=/exam/oj/ta&qru=/ta/coding-interviews/question-ranking&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D1%26tpId%3D13%26type%3D13
//1.首先去除空格 //2.对纯数字、小数点、e用标识位进行标记；
#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @return bool布尔型
     */
    bool isNumeric(string s) {
        if(s.empty()) return false;

        while(!s.empty() && s.back()==' ') s.pop_back();
        if(s.empty()) return false;

        int i = 0;
        while(s[i]==' ') i++;
        s = s.substr(i, s.size());

        bool numSeen = false;
        bool dotSeen = false;
        bool eSeen = false;

        for(int i=0; i<s.size(); i++){
            if(isdigit(s[i])){
                numSeen = true;
            }else if(s[i]=='.'){
                if(dotSeen || eSeen) return false; // 之前出现过点或者出现过e|E
                else dotSeen = true;
            }else if(s[i]=='e' || s[i]=='E'){
                if(eSeen || !numSeen) return false;
                eSeen = true;
                numSeen = false; // 别忘了置为false，排除123e或者123e+的情况，确保e|E后面也是数字
            }else if(s[i]=='-' || s[i]=='+'){
                //+|-出现在0位置或者e|E的后面第一个位置才是合法的
                if(i!=0 && s[i-1]!='e' && s[i-1]!='E') return false;
            }else return false;
        }
        return numSeen;
    }
};